package com.qwt.part_time_api.service;

import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.qwt.part_time_api.mapper.TaskMapper;
import com.qwt.part_time_api.pojo.Task;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.time.DateFormatUtils;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

import java.util.Date;

/**
 * @Author 君子慎独
 * @create 2021/11/23 0023 13:57
 * 线程池
 * 操作再线程池执行 不会影响原来的主线程
 */
@Component
@Slf4j
public class ThreadService {
    /**
     * 开启异步 执行线程池配置里面的任务
     * 在查询全部任务的情况下先更新 任务进行状态
     *
     * @param taskMapper 任务mapper
     */
    @Transactional(rollbackFor = Exception.class)
    @Async("taskExecutor")
    public void updateTaskStatus(TaskMapper taskMapper) {
        log.info("更新所有任务的当前状态");
        String nowTime = DateFormatUtils.format(new Date(), "yyyy-MM-dd HH:mm:ss");

        final int state = 3;

        for (int i = 0; i < state; i++) {
            if (i == 1) {
                UpdateWrapper<Task> wrapper = new UpdateWrapper<>();
                wrapper.apply("end_time > '" + nowTime + "'")
                        .apply("start_time < '" + nowTime + "'")
                        .apply("start_time < end_time")
                        .eq("status", 0)
                        .set("status", 1);
                taskMapper.update(null, wrapper);
            }
            if (i == 2) {
                UpdateWrapper<Task> wrapper = new UpdateWrapper<>();
                wrapper.apply("end_time < '" + nowTime + "'")
                        .apply("start_time < end_time")
                        .apply("start_time < '" + nowTime + "'")
                        .apply("status = 1")
                        .set("status", 2);
                taskMapper.update(null, wrapper);
            }
        }
        // 缓和一下
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    /**
     * 在查看任务详情时 更新该任务的报名时间状态
     *
     * @param taskMapper mapper
     * @param id         要修改的任务id
     */
    @Transactional(rollbackFor = Exception.class)
    @Async("taskExecutor")
    public void updateTaskCutoff(TaskMapper taskMapper, Long id) {
        log.info("更新任务的截止时间");
        String nowTime = DateFormatUtils.format(new Date(), "yyyy-MM-dd HH:mm:ss");

        UpdateWrapper<Task> wrapper = new UpdateWrapper<>();

        wrapper.apply("cutoff_time < '" + nowTime + "'")
                .apply("cutoff = 0")
                .apply("id = " + id)
                .set("cutoff", 1);
        taskMapper.update(null, wrapper);
        // 缓和一下
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    /**
     * 在查看任务详情时 更新该任务的访问量
     *
     * @param taskMapper mapper
     * @param id         要修改的任务id
     */
    @Transactional(rollbackFor = Exception.class)
    @Async("taskExecutor")
    public void updateTaskTraffic(TaskMapper taskMapper, Long id, Long traffic) {
        log.info("更新任务的访问量");
        //浏览次数加一
        Long view = traffic + 1;

        UpdateWrapper<Task> wrapper = new UpdateWrapper<>();

        wrapper.apply("id = " + id)
                //  这个主要是判断 前端的传过来的浏览次数和数据库的是否一致 防止两个人同时访问时 都拿一样的浏览次数来进行相加
                .apply("traffic = " + traffic)
                .set("traffic", view);
        taskMapper.update(null, wrapper);
        // 缓和一下
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
